<?php
namespace app\api\model;

use think\Exception;
use think\Db;

class Banner extends BaseModel   //继承Model后，就变成了模型层
{
	// protected $table = 'category';  //表名与模型名不一样时，指定关联表名。
	
	// 8-5 在模型内部隐藏字段
	protected $hidden = ['update_time', 'delete_time'];

	public function items(){  //关联
		// 一对多关系
		return $this->hasMany('BannerItem', 'banner_id', 'id');//关联模型的名字，关联的外键，当前模型的主键
	}

	// 多个关联模式的话，就写多个。
	// public function items1(){

	// }

	// 正式编写代码
	public static function getBannerByID($id)
	{
		// 封装业务逻辑代码
		$banner = self::with(['items', 'items.img'])->find($id);   //self是调用自身模型
		return $banner;


		// 第一种读取数据库的方式，原生SQL语句
		// $result = Db::query('select * from banner_item where banner_id=?',[$id]);//?为占位符。
		// return $result;

		// 第二种 查询构件器
		// $result = Db::table('banner_item')->where('banner_id', '=', $id)->find();  //只返回一条记录
		// $result = Db::table('banner_item')
		// 			->where('banner_id', '=', $id)
		// 			->select();//返回所有满足条件的记录
		//表达式法： where('字段名', '表达式', '查询条件');   //表达式省略掉，为两个参数的话，就是等于。不建议用这个方法。不要做这种没有意义的省略。
					// where的三种写法：表达式、数组法、闭包法。闭包是最灵活的。
		
		//闭包写法：
		// $result = Db::table('banner_item')
		// 			// ->fetchSql()   //这一句，是不会生成查询，只会生成查询SQL语句。调式时，临时加的。不太好。
		// 			->where(function ($query) use ($id){//闭包调用外部参数的方法
		// 				$query->where('banner_id', '=', $id);//可以写多个链式方法。
		// 				// $query->where('banner_id', '=', $id)->select();//这种写法是错误的。不要写执行方法。
		// 			})
		// 			->select();

		//分成两大部分：链式方法（辅助方法），查询方法（执行方法）。
		//find(); select(); update(); delete(); insert();总共有五个执行方法。
		//不同链式方法，先后位置没有关系的。相同的链式方法，有可能会有影响。

		// 非链式方法.>>>测试没有通过，可能是新版本5.0.24不支持这种写法了。
		// Db::table('banner_item');
		// Db::where('banner_id', '=', $id);
		// $result = Db::select();
		// // $result = Db::select();

		// 每次使用执行方法后，前后Db就没有关系了。前面的查询就会被删除了。
		// $result = Db::......


		// return $result;

		// ORM：Obeject Relation Mapping 对象关系映射
		// 对象与对象之间的作用关系
		// 
		// 模型  特指TP5里面的模型，是一个业务的集合。主要用于处理一些比较复杂的业务
		// 在TP5里的模型，不单是查询，还包括相关的业务逻辑。
		// 
		// 模型可以是一个表，也可以是多个表。
		// 模型更关注你的业务逻辑。不要把模型与一张表对应起来。有可能是多个表。
		// 模型 可以分三层。可以划分为多层的。如：model层， service层
		// 
		// Db属于数据库访问层；model模型是建立在数据库访问层上面，是一个处理业务逻辑的模型层

	}

	// 之前课程测试使用的代码。
	public static function getBannerByID__test($id){
		//TODO:根据Banner　ID号 获取Banner信息
		// try{
		// 	1 / 0;
		// }
		// catch(Exception $ex){
		// 	//TODO: 可以记录日志
		// 	throw $ex;
			
		// }
		// return 'this is banner info';


		return null;
	}
}